package com.qf.arr;

import java.util.Arrays;
import java.util.Scanner;

public class Demo03 {
    public static void main(String[] args) {
        // 1. 从键盘上输入5句话，逆序输出
//        printSentenceReverseOrder();

        // 2. 定义一个长度为10的数组，1、2、3为合法数字，其余为不合法数字。分别统计合法数字（1，2，3）的个数和非法数字的个数
//        legalAndIllegalNumber();

        // 3. 定义一个长度为10数组保存10个元素（1~100），输出数列中的偶数之和。以及奇数的个数
//        sumOfEvenAndOdd();

        // 4. 参加青年歌手大奖赛,有8个评委打分,(去掉一个最高一个最低)求平均分?
//        calcAvgScore();

        // 5. 录入班级学员的人数，然后循环录入学员名字。之后，输入一个名字，查找该学员是否在此班级中
//        indexStudent();

        // 6. 输入一个不大于8位的数字判断这个数是不是回文数字。提示：所谓"回文",就是正着读和反着读是一样的
//        isHuiWenNumber();

        // 7. （选做）死亡游戏（约瑟夫环问题）。8个死刑犯围成一圈（序号0-7），依次报数，每次报到三，该死刑犯出局。问最后存活的是几号。
        survival();
    }

    /**
     * 死亡游戏（约瑟夫环问题）。8个死刑犯围成一圈（序号0-7），依次报数，每次报到三，该死刑犯出局。问最后存活的是几号。
     */
    public static void survival() {
        int[] arr = {0, 1, 2, 3, 4, 5, 6, 7};

        int sum = 0;
        for (int i = 0; ; ) {
            if (arr[i] != -1) sum++;
            if (sum % 3 == 0) { // 每三个死一个
                arr[i] = -1;
            }
            if (onlyOne(arr) == true) {
                for (int j = 0; i < arr.length; j++) {
                    if (arr[j] != -1) {
                        System.out.println("存活的是 " + j + " 号");
                        return;
                    }
                }
            }

            // 循环
            if (i == arr.length - 1) {
                i = 0;
            } else i++;
        }

    }

    /**
     * 存活一人?
     * @param arr int[]
     * @return boolean
     */
    public static boolean onlyOne(int[] arr) {
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] != -1) {
                sum++;
            }
            if (sum > 1) {
                return false;
            }
        }
        return true;
    }

    /**
     * 输入一个不大于8位的数字判断这个数是不是回文数字。提示：所谓"回文",就是正着读和反着读是一样的
     */
    public static void isHuiWenNumber() {
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入一个数字:");
        int number = sc.nextInt();

        int size = getSize(number);

        boolean flag = true;
        for (int i = 1; i <= size / 2; i++) {
            if (valueOfNumberSize(number, i) != valueOfNumberSize(number, size - i + 1)) {
                flag = false;
            }
        }

        if (flag == true) {
            System.out.printf("是回文数字");
        } else {
            System.out.println("不是回文数字");
        }
    }

    /**
     * 一个数字对应位数的值
     *
     * @param number
     * @param size   位数
     * @return int
     */
    public static int valueOfNumberSize(int number, int size) {
        if (number < 10) return number;

        for (int i = 0; i < size - 1; i++) {
            number /= 10;
        }
        return number % 10;
    }

    /**
     * 判断一个数有是几位数
     *
     * @param number 获取数字
     * @return 返回位数
     */
    public static int getSize(int number) {
        if (number < 10) return 1;

        int size = 1;
        for (; number >= 10; size++) {
            number /= 10;
        }
        return size;
    }

    /**
     * 录入班级学员的人数，然后循环录入学员名字。之后，输入一个名字，查找该学员是否在此班级中
     */
    public static void indexStudent() {
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入班级人数:");
        int number = sc.nextInt();

        System.out.println("请录入学生名字:");
        String[] nameArr = new String[number];
        for (int i = 0; i < number; i++) {
            nameArr[i] = sc.next();
        }

        System.out.println("请输入需要查找的名字:");
        String indexName = sc.next();
        boolean flag = ArrUtils.arrIndex(nameArr, indexName);
        if (flag == true) {
            System.out.println("查找成功");
        } else {
            System.out.println("查找失败");
        }
    }

    /**
     * 参加青年歌手大奖赛,有8个评委打分,(去掉一个最高一个最低)求平均分?
     */

    public static void calcAvgScore() {
        // 随机八个评委分数
        int[] arr = ArrUtils.randomArr(100, 8);
        Arrays.sort(arr); //排序
        ArrUtils.printArr(arr);

        float sum = 0;
        for (int i = 1; i < arr.length - 1; i++) {
            sum += arr[i];
        }
        System.out.println("平均分:" + (sum / 6));
    }

    public static void sumOfEvenAndOdd() {
        int[] arr = ArrUtils.randomArr(100, 10);
        ArrUtils.printArr(arr);

        int evenSum = 0; // 偶数和
        int odd = 0; //
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] % 2 == 0) { // 被 2 整除,是偶数
                evenSum += arr[i];
            } else { // 不然是奇数
                odd++;
            }
        }

        System.out.println("偶数和:" + evenSum);
        System.out.println("奇数个数:" + odd);
    }

    /**
     * 从键盘上输入5句话，逆序输出
     */
    public static void printSentenceReverseOrder() {
        Scanner sc = new Scanner(System.in);

        // 获取五句话
        System.out.println("请输入五句话:");
        String[] arr = new String[5];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = sc.next();
        }

        // 倒序输出五句话
        for (int i = arr.length - 1; i >= 0; i--) {
            System.out.println(arr[i]);
        }

    }

    /**
     * 定义一个长度为10的数组，1、2、3为合法数字，其余为不合法数字。分别统计合法数字（1，2，3）的个数和非法数字的个数
     */
    public static void legalAndIllegalNumber() {
        int[] arr = ArrUtils.randomArr(10, 10);
        ArrUtils.printArr(arr);

        int legalNum = 0;
        int illegalNum = 0;

        for (int i = 0; i < arr.length; i++) {
            if (isLegalNumber(arr[i]) == true) {
                legalNum++;
            } else illegalNum++;
        }
        System.out.println("合法数字个数:" + legalNum);
        System.out.println("非法数字个数:" + illegalNum);
    }

    /**
     * 1、2、3为合法数字
     *
     * @param num int
     * @return boolean
     */
    public static boolean isLegalNumber(int num) {

        if (num == 1 || num == 2 || num == 3) return true;

        return false;
    }


}
